﻿using System.ComponentModel;
using System.Reflection;

namespace LvcChong
{
    public static class Extensions
    {
        /// <summary>
        /// 将毫秒级时间戳转换为 DateTime?，支持默认值
        /// </summary>
        /// <param name="timestamp">毫秒级时间戳（13 位）</param>
        /// <param name="defaultValue">转换失败时返回的默认值（默认为 null）</param>
        /// <returns>DateTime?</returns>
        public static DateTime? ToDateTimeFromMilliseconds(this long timestamp, DateTime? defaultValue = null)
        {
            try
            {
                return DateTimeOffset.FromUnixTimeMilliseconds(timestamp).LocalDateTime;
            }
            catch
            {
                return defaultValue; // 转换失败时返回默认值
            }
        }

        /// <summary>
        /// 将秒级时间戳转换为 DateTime?，支持默认值
        /// </summary>
        /// <param name="timestamp">秒级时间戳（10 位）</param>
        /// <param name="defaultValue">转换失败时返回的默认值（默认为 null）</param>
        /// <returns>DateTime?</returns>
        public static DateTime? ToDateTimeFromSeconds(this long timestamp, DateTime? defaultValue = null)
        {
            try
            {
                return DateTimeOffset.FromUnixTimeSeconds(timestamp).LocalDateTime;
            }
            catch
            {
                return defaultValue; // 转换失败时返回默认值
            }
        }

        /// <summary>
        /// 将object转换为long，若转换失败，则返回0。不抛出异常。
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public static long ParseToInt(this object obj)
        {
            try
            {
                return Convert.ToInt32(obj.ToString());
            }
            catch
            {
                return 0L;
            }
        }

        /// <summary>
        /// 将object转换为long，若转换失败，则返回指定值。不抛出异常。
        /// </summary>
        /// <param name="str"></param>
        /// <param name="defaultValue"></param>
        /// <returns></returns>
        public static long ParseToInt(this string str, int defaultValue)
        {
            try
            {
                return int.Parse(str);
            }
            catch
            {
                return defaultValue;
            }
        }

        /// <summary>
        /// 将object转换为long，若转换失败，则返回0。不抛出异常。
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public static long ParseToLong(this object obj)
        {
            try
            {
                return Convert.ToInt64(obj.ToString());
            }
            catch
            {
                return 0L;
            }
        }

        /// <summary>
        /// 将object转换为long，若转换失败，则返回指定值。不抛出异常。
        /// </summary>
        /// <param name="str"></param>
        /// <param name="defaultValue"></param>
        /// <returns></returns>
        public static long ParseToLong(this string str, long defaultValue)
        {
            try
            {
                return long.Parse(str);
            }
            catch
            {
                return defaultValue;
            }
        }

        public static string GetDescription(this Enum value)
        {
            return value.GetType().GetField(value.ToString())?.GetCustomAttribute<DescriptionAttribute>()?.Description;
        }

        /// <summary>
        /// 鑾峰彇鏋氫妇鐨凞escription
        /// </summary>
        /// <param name="value"></param>
        /// <returns></returns>
        public static string GetDescription(this object value)
        {
            return value.GetType().GetField(value.ToString()!)?.GetCustomAttribute<DescriptionAttribute>()?.Description;
        }

        public static List<NameValueItem> EnumToNameValues(this Type type, bool addNullValue = false)
        {
            if (!type.IsEnum) throw new Exception("非枚举类型，无法获取枚举列表");
            var ret = new List<NameValueItem>();
            if (addNullValue) ret.Add(new NameValueItem() { Value = null, Caption = "" });
            foreach (var item in System.Enum.GetValues(type))
            {
                var nv = new NameValueItem { Value = item, Name = System.Enum.GetName(type, item), Caption = item.GetDescription(), Index = (int)item };
                ret.Add(nv);
            }
            return ret;
        }

        /// <summary>
        /// 获取当前日期的月份的第一天
        /// </summary>
        /// <param name="date">当前日期</param>
        /// <returns>月份的第一天</returns>
        public static DateTime GetFirstDayOfMonth(this DateTime date)
        {
            return new DateTime(date.Year, date.Month, 1);
        }

        /// <summary>
        /// 获取当前日期的月份的最后一天
        /// </summary>
        /// <param name="date">当前日期</param>
        /// <returns>月份的最后一天</returns>
        public static DateTime GetLastDayOfMonth(this DateTime date)
        {
            // 下个月的第一天减去一天，就是当前月份的最后一天
            return new DateTime(date.Year, date.Month, 1).AddMonths(1).AddDays(-1);
        }

        /// <summary>
        /// 将字符串的首字母转换为小写
        /// </summary>
        /// <param name="input">输入字符串</param>
        /// <returns>首字母小写的字符串</returns>
        public static string ToLowerFirstChar(this string input)
        {
            if (string.IsNullOrEmpty(input))
            {
                return input; // 如果字符串为空或 null，直接返回
            }

            // 将第一个字符转换为小写，然后与剩余部分拼接
            return char.ToLower(input[0]) + input.Substring(1);
        }
    }
}
